package titt.type;


public final class Types {

	//Prefixes and tokens
	public static final String	ARRAY_PREFIX = "array_",
								NATIVE_PREFIX = "java_",
								NULL_TOKEN = "$0",
								EMPTY_STRING_TOKEN = "$1";
	
	//Array enc bytes;
	public static final byte	ARRAY_SPLITTER = ',',
								ARRAY_START = '(',
								ARRAY_END = ')';

	//Primitive types
	public static final Type	BYTE				= new Type("byte"),
								CHAR				= new Type("char"),
								INT					= new Type("int"),
								LONG				= new Type("long"),
								SHORT				= new Type("short"),
								BOOLEAN				= new Type("boolean"),
								FLOAT				= new Type("float"),
								DOUBLE				= new Type("double"),
								STRING				= new Type("string");
	
	//Special types
	public static final Type	VOID				= new Type("void");
	
	//Dynamic types
	public static final Type	UNKNOWN				= new Type("unknown");
	
	//Type functions
	public static Type toArray(Type t) {
		return new Type(ARRAY_PREFIX + t.asString());
	}
	
	public static Type toNative(Class<?> c) {
		return new Type(NATIVE_PREFIX + c.getName());
	}
		
//	public static final Type 	ARRAY_BYTE 		= new Type("byte_array"),
//								ARRAY_CHAR 		= new Type("char_array"),
//								ARRAY_INT		= new Type("int_array"),
//								ARRAY_LONG		= new Type("long_array"),
//								ARRAY_SHORT 	= new Type("short_array"),
//								ARRAY_BOOLEAN 	= new Type("boolean_array"),
//								ARRAY_FLOAT 		= new Type("float_array"),
//								ARRAY_DOUBLE	= new Type("double_array"),
//								ARRAY_STRING	= new Type("string_array");
	
//	private static final Type[] ALL_TYPES = new Type[]{
//		BYTE,CHAR,INT,LONG,SHORT,BOOLEAN,FLOAT,DOUBLE,STRING,
//		TITT,JAVA,
//		ARRAY_BYTE,ARRAY_CHAR,ARRAY_INT,ARRAY_LONG,ARRAY_SHORT,
//		ARRAY_BOOLEAN,ARRAY_FLOAT,ARRAY_DOUBLE,ARRAY_STRING		
//	};
	
		
//	public static Type getType(Object o) {
//		
////		if(o instanceof HTTPInputStream) 	return HTTP_INPUT_STREAM;
////		if(o instanceof HTTPOutputStream) 	return HTTP_OUTPUT_STREAM;
//		
//		String clname = o.getClass().getSimpleName().toLowerCase();
//
//		if(clname.equals("integer")) clname = "int";
//		if(clname.equals("character")) clname = "char";
//	
//		clname = clname.replace("[]", "_array");
//		
//		Type t = new Type(clname);
//		if(t.equalsAny(ALL_TYPES)) return t;
//		
//		return JAVA;
//	}
	
//	public static byte[] encodeAsBytes(Serializable str, Type t) {		
//		return Bytes.asBytes(encode(str, t));
//	}
	
//	public static String encode(Serializable str, Type t) {
//
//		if(str == null) 			return "null";
//
//		if(t.equals(Types.STRING)) 	return str.toString();
//
//		if(t.equalsAny(
//					Types.INT,
//					Types.LONG,
//					Types.SHORT,
//					Types.BOOLEAN,
//					Types.DOUBLE,
//					Types.FLOAT,
//					Types.BYTE, 
//					Types.CHAR))	return ""+str;
//				
//		return null;
//	}
	
//	public static Serializable decode(byte[] b, Type t) {
//		return decode(Bytes.asString(b), t);
//	}
	
//	public static Serializable decode(String str, Type t) {
//
//		if(str.equals("null")) 		return null;
//		
//		if(t.equals(Types.STRING)) 	return str;
//		if(t.equals(Types.INT)) 	return Integer.parseInt(str);
//		if(t.equals(Types.LONG)) 	return Long.parseLong(str);
//		if(t.equals(Types.SHORT)) 	return Short.parseShort(str);
//		if(t.equals(Types.BOOLEAN))	return Boolean.parseBoolean(str);
//		if(t.equals(Types.DOUBLE))	return Double.parseDouble(str);
//		if(t.equals(Types.FLOAT))	return Float.parseFloat(str);
//		if(t.equals(Types.BYTE))	return Byte.parseByte(str);
//		if(t.equals(Types.CHAR))	return str.charAt(0);
//		
//		//TODO:
//		//Array types
//		
//		return null;
//	}
	
//	public static Class<?> getClass(Serializable s, Type t) {
//		if(t.equals(INT)) 		return java.lang.Integer.TYPE;
//		if(t.equals(BOOLEAN))	return java.lang.Boolean.TYPE;
//		if(t.equals(CHAR))		return java.lang.Character.TYPE;
//		if(t.equals(BYTE))		return java.lang.Byte.TYPE;
//		if(t.equals(SHORT))		return java.lang.Short.TYPE;
//		if(t.equals(LONG))		return java.lang.Long.TYPE;
//		if(t.equals(FLOAT))		return java.lang.Float.TYPE;
//		if(t.equals(DOUBLE))	return java.lang.Double.TYPE;
//		
//		if(t.equals(STRING))	return java.lang.String.class;
//		
//		if(t.equals(ARRAY_BOOLEAN))	return boolean[].class;
//		if(t.equals(ARRAY_BYTE))	return byte[].class;
//		if(t.equals(ARRAY_CHAR))	return char[].class;
//		if(t.equals(ARRAY_DOUBLE))	return double[].class;
//		if(t.equals(ARRAY_FLOAT))	return float[].class;
//		if(t.equals(ARRAY_INT))		return int[].class;
//		if(t.equals(ARRAY_LONG))	return long[].class;
//		if(t.equals(ARRAY_SHORT))	return short[].class;
//		if(t.equals(ARRAY_STRING))	return String[].class;
//		
//		return s.getClass();
//	}
	
	private Types() {}
}
